package br.unirio.webdisco.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.unirio.webdisco.dao.conn.BasePostgresDAO;
import br.unirio.webdisco.entity.Usuario;

public class UsuarioPostgresDAO extends BasePostgresDAO<Usuario> {

	@Override
	public void incluir(Usuario usuario) throws Exception {
		Connection connection = criaConexao(false);
		String sql = "INSERT INTO Usuario (IdUsuario, IdPerfil, Nome, SobreNome, Email, Senha) ";
			   sql += "VALUES (nextval('SEQ_IdUsuario'),?,?,?,?,?);";
			   
			   
		PreparedStatement stmt = null;

		try {
			stmt = connection.prepareStatement(sql);
			if(usuario.getIdPerfil() == 2)
				stmt.setInt(1, 2);
			else
				stmt.setInt(1, 1);
			stmt.setString(2, usuario.getNome());
			stmt.setString(3, usuario.getSobreNome());
			stmt.setString(4, usuario.getEmail());
			stmt.setString(5, usuario.getSenha());
			
			int retorno = stmt.executeUpdate();
			if (retorno == 0) {
				connection.rollback();
				throw new SQLException(
						"Ocorreu um erro inesperado no momento de inserir dados de local no banco!");
			}
			connection.commit();

		} catch (SQLException e) {
			connection.rollback();
			throw e;
		} finally {
			try {
				stmt.close();
				this.fechaConexao();
			} catch (SQLException e) {
				throw e;
			}

		}	
		
	}

	@Override
	public void alterar(Usuario usuario) throws Exception {
		Connection connection = criaConexao(false);
		String sql =  "UPDATE usuario SET IdPerfil = ?, Nome = ?, SobreNome = ?, Email = ?, Senha = ? ";
			   sql += "WHERE idUsuario = ?";
			   
		PreparedStatement stmt = null;
		try {
			stmt = connection.prepareStatement(sql);
			
			if(usuario.getIdPerfil() == 2)
				stmt.setInt(1, 2);
			else
				stmt.setInt(1, 1);
			stmt.setString(2, usuario.getNome());
			stmt.setString(3, usuario.getSobreNome());
			stmt.setString(4, usuario.getEmail());
			stmt.setString(5, usuario.getSenha());
			stmt.setInt(6, usuario.getIdUsuario());
			
			int retorno = stmt.executeUpdate();
			if (retorno == 0) {
				connection.rollback();
				throw new SQLException(
						"Ocorreu um erro inesperado no momento de alterar dados de local no banco!");
			}
			connection.commit();

		} catch (SQLException e) {
			connection.rollback();
			throw e;
		} finally {
			try {
				stmt.close();
				this.fechaConexao();
			} catch (SQLException e) {
				throw e;
			}

		}		
	}

	@Override
	public void excluir(Usuario usuario) throws Exception {
		Connection connection = criaConexao(false);
		String sql = "DELETE FROM usuario WHERE IdUsuario = ?";
		PreparedStatement stmt = null;
		try {
			stmt = connection.prepareStatement(sql);
			stmt.setInt(1, usuario.getIdUsuario());
			
			int retorno = stmt.executeUpdate();
			if (retorno == 0) {
				connection.rollback();
				throw new SQLException(
						"Ocorreu um erro inesperado no momento de remover dados de local no banco!");
			}
			connection.commit();

		} catch (SQLException e) {
			connection.rollback();
			throw e;
		} finally {
			try {
				stmt.close();
				this.fechaConexao();
			} catch (SQLException e) {
				throw e;
			}

		}
	}

	@Override
	public Integer count() throws Exception {
		Connection connection = criaConexao(false);
		String sql = "SELECT COUNT(*) AS Count FROM USUARIO ";
		
		
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Integer countUsuario = null;
		
		try {
			stmt = connection.prepareStatement(sql);
			rs = stmt.executeQuery();
			while (rs.next()) 	
				countUsuario = rs.getInt("Count");
				
			
		} catch (SQLException e) {
			throw e;
		} finally {
			try {
				stmt.close();
				rs.close();
				this.fechaConexao();
			} catch (SQLException e) {
				throw e;
			}

		}
		return countUsuario;
	}
	
	@Override
	public List<Usuario> listar(Integer paginaTamanho, Integer paginaAtual) throws Exception {
		Connection connection = criaConexao(false);
		String sql = "SELECT * FROM Usuario LIMIT ? OFFSET ?*?";
		
		
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario usuario= null;
		List<Usuario> listaUsuario = new ArrayList<Usuario>();
		
		try {
			stmt = connection.prepareStatement(sql);
			stmt.setInt(1, paginaTamanho);
			stmt.setInt(2, paginaAtual);
			stmt.setInt(3, paginaTamanho);
			rs = stmt.executeQuery();
			while (rs.next()) 
			{
				usuario = new Usuario();
				usuario.setIdUsuario(rs.getInt("IdUsuario"));
				usuario.setNome(rs.getString("Nome"));
				usuario.setSobreNome(rs.getString("SobreNome"));
				usuario.setEmail(rs.getString("Email"));
				usuario.setSenha(rs.getString("Senha"));
				
				listaUsuario.add(usuario);
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			try {
				stmt.close();
				rs.close();
				this.fechaConexao();
			} catch (SQLException e) {
				throw e;
			}

		}
		return listaUsuario;
	}
	
	public Usuario consultarUsuario(String u, String p) throws Exception {
		
		Connection connection = criaConexao(false);
		String sql = "SELECT * FROM Usuario WHERE login = ? AND senha = ?";
		PreparedStatement statement =  null;
		ResultSet rs = null;
		Usuario usuario = null;
		
		try {
			statement = connection.prepareStatement(sql);
			statement.setString(1, u);
			statement.setString(2, p);
			
			rs = statement.executeQuery();
			
			if (rs.next()) {
				usuario = new Usuario();
				usuario.setNome(rs.getString("nome"));
				usuario.setSobreNome(rs.getString("sobreNome"));
				usuario.setEmail(rs.getString("email"));
				usuario.setSenha(rs.getString("senha"));
			}
			else {
				return null;
			}
		}
		catch (SQLException e) {
			System.out.println(e.getMessage());
		}
		finally {
			try {
				if(statement != null)
					statement.close();
				if(rs != null)
					rs.close();
				this.fechaConexao();
			}
			catch (SQLException e) {
				System.out.println(e.getMessage());
			}
		}
		return usuario;
	}

	@Override
	public Usuario consultarPorId(Integer id) throws Exception {
		Connection connection = criaConexao(false);
		String sql = "SELECT * FROM Usuario WHERE IdUsuario = ?";
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario usuario= null;
		try {
			stmt = connection.prepareStatement(sql);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if (rs.next()) {
				usuario = new Usuario();
				usuario.setIdUsuario(rs.getInt("IdUsuario"));
				usuario.setNome(rs.getString("Nome"));
				usuario.setSobreNome(rs.getString("SobreNome"));
				usuario.setEmail(rs.getString("Email"));
				usuario.setSenha(rs.getString("Senha"));
				
				if(rs.getInt("IdPerfil") == 2)
					usuario.setIdPerfil(2);
				
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			try {
			
				if(stmt != null)
					stmt.close();
				
				if(rs != null)
					rs.close();
				
				this.fechaConexao();

			} catch (SQLException e) {
				throw e;
			}

		}
		return usuario;
	}

	public Usuario consultarPorEmail(String email) throws Exception {
		Connection connection = criaConexao(false);
		String sql = "SELECT * FROM Usuario WHERE email = ?";
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario usuario= null;
		try {
			stmt = connection.prepareStatement(sql);
			stmt.setString(1, email);
			rs = stmt.executeQuery();
			if (rs.next()) {
				usuario = new Usuario();
				usuario.setIdUsuario(rs.getInt("IdUsuario"));
				usuario.setNome(rs.getString("Nome"));
				usuario.setSobreNome(rs.getString("SobreNome"));
				usuario.setEmail(rs.getString("Email"));
				usuario.setSenha(rs.getString("Senha"));
				
				if(rs.getInt("IdPerfil") == 2)
					usuario.setIdPerfil(2);
				
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			try {
			
				if(stmt != null)
					stmt.close();
				
				if(rs != null)
					rs.close();
				
				this.fechaConexao();

			} catch (SQLException e) {
				throw e;
			}

		}
		return usuario;
	}
	
	@Override
	public List<Usuario> consultar(String parametros) throws Exception {
		Connection connection = criaConexao(false);
		String sql = "SELECT * FROM Usuario WHERE 1 = 1 ";
		sql += parametros;
		
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario usuario= null;
		List<Usuario> listaUsuario = new ArrayList<Usuario>();
		
		try {
			stmt = connection.prepareStatement(sql);
			rs = stmt.executeQuery();
			while (rs.next()) 
			{
				usuario = new Usuario();
				usuario.setIdUsuario(rs.getInt("IdUsuario"));
				usuario.setIdPerfil(rs.getInt("IdPerfil"));
				usuario.setNome(rs.getString("Nome"));
				usuario.setSobreNome(rs.getString("SobreNome"));
				usuario.setEmail(rs.getString("Email"));
				usuario.setSenha(rs.getString("Senha"));
				
				listaUsuario.add(usuario);
				
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			try {
				stmt.close();
				rs.close();
				this.fechaConexao();
			} catch (SQLException e) {
				throw e;
			}

		}
		return listaUsuario;
	}
	}

